package com.edu.exam.entity.grading.query;

import com.edu.exam.enums.grading.CacheEvictionPolicy;
import com.edu.exam.enums.grading.CacheLifecyclePolicy;
import com.edu.exam.enums.grading.CacheType;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

/**
 * 成绩查询缓存表实体类
 *
 * <p>所属模块：B-06 成绩管理模块</p>
 * <p>对应数据库表：grade_query_cache</p>
 *
 * <p>成绩查询缓存表实体用于存储成绩查询的缓存数据，包含
 * 缓存键值、缓存内容、过期时间、命中统计等。为查询性能优化提供高效的缓存管理。</p>
 *
 * <p>核心功能：
 * - 数据缓存：存储查询结果的缓存数据
 * - 过期管理：控制缓存数据的有效期
 * - 命中统计：记录缓存的使用情况
 * - 性能优化：减少数据库查询，提高响应速度
 * - 内存管理：控制缓存数据的大小和生命周期</p>
 *
 * @author 系统生成
 * @version 2.0
 * @since 2025-11-15
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@EntityListeners(AuditingEntityListener.class)
public class GradeQueryCache {

    /**
     * 主键ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 缓存键值
     *
     * <p>缓存的唯一键值，用于标识和检索缓存数据。</p>
     */
    @Column(name = "cache_key", nullable = false, unique = true, length = 255)
    private String cacheKey;

    /**
     * 缓存数据
     *
     * <p>缓存的查询结果数据，JSON格式存储。</p>
     */
    @Lob
    @Column(name = "cache_data", columnDefinition = "LONGTEXT")
    private String cacheData;

    /**
     * 缓存类型
     *
     * <p>缓存数据的类型标识。</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "cache_type", nullable = false, length = 30)
    private CacheType cacheType;

    /**
     * 过期时间
     *
     * <p>缓存数据的过期时间。</p>
     */
    @Column(name = "expire_time", nullable = false)
    private LocalDateTime expireTime;

    /**
     * 命中次数
     *
     * <p>缓存被命中的总次数。</p>
     */
    @Column(name = "hit_count", nullable = false)
    private Integer hitCount = 0;

    /**
     * 最后访问时间
     *
     * <p>缓存最后被访问的时间。</p>
     */
    @Column(name = "last_access_time")
    private LocalDateTime lastAccessTime;

    /**
     * 数据大小
     *
     * <p>缓存数据的字节大小。</p>
     */
    @Column(name = "data_size")
    private Long dataSize;

    /**
     * 压缩标记
     *
     * <p>标记缓存数据是否经过压缩。</p>
     */
    @Column(name = "is_compressed", nullable = false)
    private Boolean isCompressed = false;

    /**
     * 压缩前大小
     *
     * <p>数据压缩前的字节大小。</p>
     */
    @Column(name = "original_size")
    private Long originalSize;

    /**
     * 压缩算法
     *
     * <p>使用的压缩算法类型。</p>
     */
    @Column(name = "compression_algorithm", length = 20)
    private String compressionAlgorithm;

    /**
     * 缓存优先级
     *
     * <p>缓存的优先级，用于缓存清理时的排序。</p>
     */
    @Column(name = "cache_priority", nullable = false)
    private Integer cachePriority = 0;

    /**
     * 缓存标签
     *
     * <p>缓存的分类标签，用于批量管理。</p>
     */
    @Column(name = "cache_tags", length = 500)
    private String cacheTags;

    /**
     * 查询条件
     *
     * <p>生成缓存时的查询条件，JSON格式存储。</p>
     */
    @Column(name = "query_condition", columnDefinition = "TEXT")
    private String queryCondition;

    /**
     * 查询参数
     *
     * <p>生成缓存时的查询参数，JSON格式存储。</p>
     */
    @Column(name = "query_parameters", columnDefinition = "TEXT")
    private String queryParameters;

    /**
     * 用户ID
     *
     * <p>创建缓存的用户ID，用于用户级缓存隔离。</p>
     */
    @Column(name = "user_id")
    private Long userId;

    /**
     * 会话ID
     *
     * <p>创建缓存的会话ID，用于会话级缓存隔离。</p>
     */
    @Column(name = "session_id", length = 100)
    private String sessionId;

    /**
     * 依赖数据版本
     *
     * <p>缓存依赖的数据版本号，用于数据变更时的缓存失效。</p>
     */
    @Column(name = "dependency_version", length = 100)
    private String dependencyVersion;

    /**
     * 缓存来源
     *
     * <p>缓存数据的来源标识。</p>
     */
    @Column(name = "cache_source", length = 50)
    private String cacheSource;

    /**
     * 缓存描述
     *
     * <p>缓存内容的描述信息。</p>
     */
    @Column(name = "cache_description", length = 500)
    private String cacheDescription;

    /**
     * 访问频率
     *
     * <p>缓存的访问频率（次/分钟）。</p>
     */
    @Column(name = "access_frequency")
    private Double accessFrequency;

    /**
     * 热度评分
     *
     * <p>缓存的热度评分，用于缓存预热和清理策略。</p>
     */
    @Column(name = "heat_score")
    private Double heatScore;

    /**
     * 是否持久化
     *
     * <p>标记缓存是否需要持久化存储。</p>
     */
    @Column(name = "is_persistent", nullable = false)
    private Boolean isPersistent = false;

    /**
     * 是否预热
     *
     * <p>标记是否为预热缓存。</p>
     */
    @Column(name = "is_warmup", nullable = false)
    private Boolean isWarmup = false;

    /**
     * 生命周期策略
     *
     * <p>缓存的生命周期管理策略。</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "lifecycle_policy", length = 30)
    private CacheLifecyclePolicy lifecyclePolicy;

    /**
     * 清理策略
     *
     * <p>缓存的清理策略。</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "eviction_policy", length = 30)
    private CacheEvictionPolicy evictionPolicy;

    /**
     * 附加元数据
     *
     * <p>附加的缓存元数据，JSON格式存储。</p>
     */
    @Column(name = "additional_metadata", columnDefinition = "TEXT")
    private String additionalMetadata;

    // ===== 审计字段 =====

    /**
     * 创建时间
     */
    @CreatedDate
    @Column(name = "create_time", nullable = false, updatable = false)
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    @LastModifiedDate
    @Column(name = "update_time", nullable = false)
    private LocalDateTime updateTime;

    /**
     * 创建者ID
     */
    @Column(name = "creator_id")
    private Long creatorId;
}